函数参数默认值(缺省函数)
函数参数在有默认值时,如果调用时没有传参,则默认push默认值。
实例一:不带默认值
#include
using namespace std;int fun(int a, int b, int c);int main()
{fun(10, 20, 30); return 0;
}int fun(int a, int b, int c)
{cout << a << &#39;\n&#39; << b << &#39;\n&#39; << c << endl;return 0;
}
实例二&#xff1a;函数声明与定义冲突
函数的默认值在声明时&#xff0c;同一个参数不能重复赋值。如以下实例&#xff1a;
int fun1(int a, int b, int c &#61; 100);
int main()
{fun1(10, 20, 30); return 0;
}int fun1(int a, int b, int c &#61; 100)
{cout << a << &#39;\n&#39; << b << &#39;\n&#39; << c << endl;return 0;
}
在例中&#xff0c;参数 c
进行了重复赋值&#xff0c;编译器在编译时给出报错信息为&#xff1a;“重定义默认参数: 参数 1”。
原因分析&#xff1a;函数的声明和定义都会产生函数符号&#xff0c;且函数符号相同。在进行默认参数赋值时&#xff0c;声明点和定义点的参数列表中的参数只需要&#xff08;且只能&#xff09;赋值一次&#xff0c;因为如果两次赋值的值不同&#xff0c;编译器就无法判断该使用哪一个值作为默认值使用。
实例三&#xff1a;声明点和定义点同时赋值
函数的默认参数只支持调用方(main)可见的参数列表中的参数&#xff0c;如&#xff1a;本例中在主函数之上声明或定义的fun2()
#include
using namespace std;int fun2(int a, int b, int c &#61; 100);int main()
{fun2(10, 20, 30);fun2(10, 20);return 0;
}int fun2(int a, int b &#61; 100, int c)
{cout << a << &#39;\n&#39; << b << &#39;\n&#39; << c << endl;return 0;
}
实例四&#xff1a;多个声明中连续赋值
函数的声明可以有多个&#xff0c;可以在声明中遵循从右向左连续赋值。如下实例&#xff1a;
#include
using namespace std;int fun3(int a, int b, int c &#61; 100);
int fun3(int a, int b &#61; 100, int c);
int main()
{fun3(10, 20, 30);fun3(10, 20); fun3(10); return 0;
}int fun3(int a, int b, int c)
{cout << a << &#39;\n&#39; << b << &#39;\n&#39; << c << endl;return 0;
}
注&#xff1a;
需要注意的是&#xff0c;实例二在调用点是已传入实参&#xff0c;且传入的实参&#xff08;缺省参数&#xff09;在跳转到函数主体时发现与函数主体中的缺省参数存在重复定义&#xff0c;从而引发报错。
而实例三中&#xff0c;在调用点传参时参照fun3()的声明&#xff0c;只有一个缺省参数&#xff0c;并且在传参后跳转到函数主体的过程中没有发现同一个缺省参数的重定义&#xff0c;因此实例三没有报错&#xff0c;但也因此实例三在函数主体中的缺省参数失效&#xff08;如果传入参数&#xff0c;使用传入的参数&#xff0c;否则使用默认缺省值&#xff09;。